﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Quail
{

    public interface IFluentAssertion : IAssertActual, IAssertLevel, IAssertPreExpression, IAssertExpression, IAssertExpected, IAssertExecute, IUnitTestingFluentAssertions                                     
    {
    }

    public interface IAssertActual : IAssertActualNonNumeric, IAssertActualNumeric, IAssertActualString
    {
        IAssertLevel This<T>(T myObj);
    }

    public interface IAssertActualNonNumeric
    {
    }

    public interface IAssertActualString
    {
        IAssertLevel ThisString(String myString);
    }

    public interface IAssertActualNumeric
    {
        IAssertLevel ThisInteger(Int32 myNumber);
        IAssertLevel ThisDecimal(Decimal myNumber);
        IAssertLevel ThisNumber(object myNumber);
    }

    public interface IAssertActualCollectoin
    {
        IAssertLevel ThisList<T>(List<T> list);
    }
    public interface IAssertLevel
    {
        IAssertPreExpression Must();
        IAssertPreExpression Should();
        IAssertPreExpression Might();
        IAssertExpression MustBe();
        IAssertExpression ShouldBe();
        IAssertExpression MightBe(); 
    }

    public interface IAssertPreExpression
    {
        IAssertExpression Be();
        IAssertExpression NotBe();
    }

    public interface IAssertExpression : IAssertExpressionNonNumeric, IAssertExpressionNumeric, IAssertExpressionString
    {
        IAssertExecute Null();
        IAssertExecute EqualTo<T>(T expectedObject);
    }

    public interface IAssertExpressionNonNumeric
    {

    }

    public interface IAssertExpressionString
    {
        IAssertExecute NullOrEmpty();
        IAssertExpressionString WhileIgnoringCase();
        IAssertExpectedString TheSameAs();
        IAssertExpectedString Contains();
        IAssertExpectedString Containing();
    }

    public interface IAssertExpressionNumeric
    {
        IAssertExpectedNumeric GreaterThan();
        IAssertExpectedNumeric GreaterThanOrEqualTo();
        IAssertExpectedNumeric LessThan();
        IAssertExpectedNumeric LessThanOrEqualTo();
    }


    public interface IAssertExpected : IAssertExpectedNonNumeric, IAssertExpectedNumeric, IAssertExpectedString
    {
        
    }

    public interface IAssertExpectedString
    {
        IAssertExecute ThatString(String expected);
        void ThatString(String expected, String assertReason);  
    }

    public interface IAssertExpectedNonNumeric
    {
        IAssertExecute That<T>(T expected);
        IAssertExecute That(object expected);
        void That<T>(T expected, String assertReason);
        void That(object expected, String assertReason);
    }

    public interface IAssertExpectedNumeric
    {
        IAssertExecute ThatInteger(Int32 expected);
        IAssertExecute ThatDecimal(Decimal expected);
        IAssertExecute ThatNumber(object expected);
        void ThatInteger(Int32 expected, String assertReason);
        void ThatDecimal(Decimal expected, String assertReason);
        void ThatNumber(object expected, String assertReason);
    }

    public interface IAssertExpectedCollection
    {
        IAssertExecute ThatList<T>(List<T> expected);
        IAssertExecute ThatItem<T>(T item);
    }

    public interface IAssertExecute
    {
        IAssertActual Or();
        IAssertActual And();
        IAssertExecute ForTask(Task task);
        void Because(String assertReason);   
#if DEBUG
        
#endif
    }

    public interface IUnitTestingFluentAssertions
    {
        FluentAssertion Get();
        Boolean GetResult();
        void SkipQUailLog();
    }

}
